/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.conf.mbean;

import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.AlmacenUbicacionDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.conf.manager.AlmacenUbicacionManager;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;

import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("almacenMBean")
@Scope("session")
public class AlmacenMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(AlmacenMBean.class);
    @Resource
    private AlmacenManager manager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private AlmacenUbicacionManager almacenUbicacionManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private RecursosManager recursosManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<AlmacenDto> lista;
    private List<OrganizacionDto> listaOrganizaciones;
    private AlmacenDto dto;
    private AlmacenDto dtoFiltro;
    private AlmacenUbicacionDto ubicacionDto;
    private String keyEntidad = "key.entidad.almacen";
    private String keyUbicacionEntidad = "key.entidad.almacen.ubicacion";
    private String tituloDetalle;

    public AlmacenMBean() {
        this.dtoFiltro = new AlmacenDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.ubicacionDto = null;
        this.dtoFiltro = new AlmacenDto();
        this.dtoFiltro.setNombre("");
        this.dtoFiltro.setReferencia("");
        this.dtoFiltro.setDireccion("");
        this.dtoFiltro.setContacto("");
        this.dtoFiltro.setEstado(Boolean.TRUE);
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        this.ubicacionDto = this.almacenUbicacionManager.inicializar();
        return manager.getUrl();
    }

    public void nuevoAlmacenUbicacion() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyUbicacionEntidad, sessionMBean.getAccionDetalle());
        this.ubicacionDto = this.almacenUbicacionManager.inicializar();
        this.ubicacionDto.setAlmacenDto(dto);
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.ubicacionDto = this.almacenUbicacionManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
            this.dto.setComentario("");
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void editarAlmacenUbicacion() {
        this.tituloDetalle = recursosManager.construirTitulo(keyUbicacionEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        try {
            this.ubicacionDto = almacenUbicacionManager.obtenerPorId(this.ubicacionDto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.ubicacionDto = this.almacenUbicacionManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void verAlmacenUbicacion() {
        this.tituloDetalle = recursosManager.construirTitulo(keyUbicacionEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        try {
            this.ubicacionDto = almacenUbicacionManager.obtenerPorId(this.ubicacionDto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }

    public void guardarAlmacenUbicacion() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (almacenUbicacionManager.guardar(ubicacionDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
            }else{
                resultado = false;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verBitacoraDetalle() {
        bitacoraManager.cargarBitacoraEntidad(almacenUbicacionManager.getIdEntidad(), this.ubicacionDto.getId());
        return null;
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public String retroceder() {
        buscar();
        return manager.getUrlLista();
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        AlmacenMBean.logger = logger;
    }

    public AlmacenManager getManager() {
        return manager;
    }

    public void setManager(AlmacenManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<AlmacenDto> getLista() {
        return lista;
    }

    public void setLista(List<AlmacenDto> lista) {
        this.lista = lista;
    }

    public AlmacenDto getDto() {
        return dto;
    }

    public void setDto(AlmacenDto dto) {
        this.dto = dto;
    }

    public AlmacenDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(AlmacenDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public List<OrganizacionDto> getListaOrganizaciones() {
        try {
            listaOrganizaciones = organizacionManager.obtenerActivosPorEmpresa(new EmpresaDto(sessionMBean.getSessionUsuarioDto().getEmpresa()));
        } catch (DAOException ex) {
            logger.error("ERROR_SISTEMA", ex);
        }
        return listaOrganizaciones;
    }

    public void setListaOrganizaciones(List<OrganizacionDto> listaOrganizaciones) {
        this.listaOrganizaciones = listaOrganizaciones;
    }

    public AlmacenUbicacionDto getUbicacionDto() {
        return ubicacionDto;
    }

    public void setUbicacionDto(AlmacenUbicacionDto ubicacionDto) {
        this.ubicacionDto = ubicacionDto;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }
}
